﻿using System;
using System.Runtime.InteropServices;

namespace Alex.Library.Win32
{
    /// <summary>
    /// Win32 SDK中与Shell相关的API
    /// </summary>
    public sealed class ShellApi
    {
        /// <summary>
        /// 运行一个外部程序（或者是打开一个已注册的文件、打开一个目录、打印一个文件等等），并对外部程序有一定的控制。
        /// </summary>
        /// <param name="hwnd">指定父窗口句柄</param>
        /// <param name="lpOperation">指定动作, 譬如: open、print</param>
        /// <param name="lpFile">指定要打开的文件或程序</param>
        /// <param name="lpParameters">给要打开的程序指定参数; 如果打开的是文件应该为null</param>
        /// <param name="lpDirectory">缺省目录</param>
        /// <param name="nShowCmd">选项</param>
        /// <returns>
        /// <![CDATA[
        /// 执行成功会返回应用程序句柄; 如果这个值 <= 32, 表示执行错误，可能的错误值：
        /// 0 {内存不足}
        /// ERROR_FILE_NOT_FOUND = 2; {文件名错误}
        /// ERROR_PATH_NOT_FOUND = 3; {路径名错误}
        /// ERROR_BAD_FORMAT = 11; {EXE 文件无效}
        /// SE_ERR_SHARE = 26; {发生共享错误}
        /// SE_ERR_ASSOCINCOMPLETE = 27; {文件名不完全或无效}
        /// SE_ERR_DDETIMEOUT = 28; {超时}
        /// SE_ERR_DDEFAIL = 29; {DDE 事务失败}
        /// SE_ERR_DDEBUSY = 30; {正在处理其他 DDE 事务而不能完成该 DDE 事务}
        /// SE_ERR_NOASSOC = 31; {没有相关联的应用程序} 
        /// ]]>
        /// </returns>
        [DllImport("shell32.dll")]
        public static extern IntPtr ShellExecute(IntPtr hwnd, string lpOperation, string lpFile,
            string lpParameters, string lpDirectory, ShowCommands nShowCmd);
    }
}
